
#include "nane/core/crt/Win32/Win32FileSystemImpl_.h"
#include "nane/core/crt/Win32/Win32ReadFile_.h"
#include "nane/core/crt/Win32/Win32WriteFile_.h"
#include "nane/core/WinAPI/winapi.h"

namespace nane 
{
    ////////////////////////////////////////////////////////////////////////////////////////////////
    FileSystem::Implementation::Implementation()
    {
        
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    FileSystem::Implementation::~Implementation()
    {
        
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    bool FileSystem::Implementation::Initialize()
    {
        return true;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    void FileSystem::Implementation::Shutdown()
    {
        
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    IReadFile* FileSystem::Implementation::OpenReadFile( const char* _filename )
    {
        Win32ReadFile* file = NULL;
        HANDLE hFile = WinAPI::CreateFile(_filename, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);
        if( hFile != INVALID_HANDLE_VALUE )
        {
            file = new Win32ReadFile(this, hFile, _filename);
        }
        return file;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    IWriteFile* FileSystem::Implementation::OpenWriteFile( const char* _filename )
    {
        Win32WriteFile* file = NULL;
        HANDLE hFile = WinAPI::CreateFile(_filename, GENERIC_WRITE, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL);
        if( hFile != INVALID_HANDLE_VALUE )
        {
            file = new Win32WriteFile(this, hFile, _filename);
        }
        return file;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    bool FileSystem::Implementation::Exists( const char* _filename )
    {
        return WinAPI::GetFileAttributes(_filename) != INVALID_FILE_ATTRIBUTES;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    bool FileSystem::Implementation::DeleteFile( const char* _filename )
    {
        return WinAPI::DeleteFile(_filename) == TRUE;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    bool FileSystem::Implementation::CreateFolder( const char* _path )
    {
        return WinAPI::CreateDirectory(_path, NULL) == TRUE;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    bool FileSystem::Implementation::DeleteFolder( const char* _path )
    {
        return WinAPI::RemoveDirectory(_path) == TRUE;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    void FileSystem::Implementation::Release( Win32ReadFile* _win32ReadFile )
    {
        ::CloseHandle(_win32ReadFile->interface);
        delete _win32ReadFile;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
    void FileSystem::Implementation::Release( Win32WriteFile* _win32WriteFile )
    {
        ::CloseHandle(_win32WriteFile->interface);
        delete _win32WriteFile;
    }
    ////////////////////////////////////////////////////////////////////////////////////////////////
}   // namespace nane

